package com.barney.support.http;

import java.io.InputStream;
import java.util.List;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.NameValuePair;

/**
 * HTTP 실행
 */
public interface HttpInvocation<T> {

	/**
	 * 매개변수를 추가한다.
	 *
	 * @param name 매개변수 명
	 * @param value 값
	 */
	void addParameter(String name, Object value);

	/**
	 * 요청헤더를 추가한다.
	 *
	 * @param name 헤더명
	 * @param value 값
	 */
	void addRequestHeader(String name, String value);

	/**
	 * 요청 URI를 반환한다.
	 */
	String getUri();

	/**
	 * 인코딩을 반환한다.
	 */
	String getEncoding();

	/**
	 * 매개변수 인코딩을 반환한다.
	 */
	String getParameterEncoding();

	/**
	 * 매개변수를 배열을 반환한다.
	 */
	NameValuePair[] getParameters();

	/**
	 * 요청 헤더 목록을 반환한다.
	 */
	List<Header> getRequestHeaders();

	/**
	 * 응답 코드를 받았을 때 처리
	 * @param statusCode
	 */
	void onResponseStatus(int statusCode);

	/**
	 * 오류가 발생했을 때 처리
	 * @param exception
	 */
	void onException(Exception exception);

	/**
	 * 응답 헤더를 받았을 때 처리
	 * @param name
	 * @param value
	 */
	void onResponseHeader(String name, String value);

	/**
	 * 응답을 받았을 때 처리
	 * @param inputStream
	 */
	void onResponseBody(InputStream inputStream) throws Exception;

	/**
	 * 요청에 대한 기대한 결과를 반환한다.
	 */
	T getReturnValue();

	/**
	 * 요청에 사용할 UserAgent를 반환한다.
	 *
	 * @see com.barney.support.http.UserAgent
	 */
	String getUserAgent();
}
